package org.qianji.goosql.field;

import java.util.List;
import java.util.Map;

/**
 * 别名字段，指定别名的字段。
 * 
 * @author gmz
 * 
 */
public class AliasField extends AbstractField {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8185635040079065774L;

	private Field queryField;
	private String fieldAlias;

	/**
	 * 根据表、别名构造别名字段。
	 * 
	 * @param queryField
	 *            {@link Field Field} 表
	 * @param fieldAlias
	 *            {@link String String} 别名
	 */
	public AliasField(Field queryField, String fieldAlias) {
		super();
		if (queryField == null || fieldAlias == null || fieldAlias.isEmpty()) {
			throw new NullPointerException("args can't be null");
		}
		this.queryField = queryField;
		this.fieldAlias = fieldAlias;
	}

	/**
	 * 获取表。
	 * 
	 * @return {@link Field Field} 表
	 */
	public Field getQueryField() {
		return queryField;
	}

	/**
	 * 获取字段别名。
	 * 
	 * @return {@link String String} 别名
	 */
	public String getFieldAlias() {
		return fieldAlias;
	}

	@Override
	public String getField() {
		return queryField.getField();
	}

	@Override
	public List<Object> getPlacedParameters() {
		return queryField.getPlacedParameters();
	}

	@Override
	public Map<String, Object> getNamedParameters() {
		return queryField.getNamedParameters();
	}

	@Override
	public String toSql() {
		StringBuffer fld = new StringBuffer(queryField.getField()).append(" as ").append(fieldAlias);
		return fld.toString();
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null || !(obj instanceof AliasField)) {
			return false;
		}
		AliasField other = (AliasField) obj;
		if (queryField.equals(other.getQueryField()) && fieldAlias.equals(other.getFieldAlias())) {
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
		int hc = 37 * 17 + queryField.hashCode();
		hc = 37 * hc + fieldAlias.hashCode();
		return hc;
	}

	@Override
	public String toString() {
		return toSql();
	}

}
